/**
 *  iterator（迭代器）是一个对象（要符合迭代器协议），它定义一个序列，并在终止时可能附带一个返回值
 *  必须要有next()
 *
 * */

// const arr = [1, 2, 3]
// let index = 0
// const arrIterator = {
//   next() {
//     //done:Boolean
//     //value: 具体值/ undefined
//     const value = index < arr.length ? arr[index++] : undefined
//     return {
//       done: index >= arr.length,
//       value
//     }
//   }
// }
// console.log(arrIterator.next())
// console.log(arrIterator.next())
// console.log(arrIterator.next())
// console.log(arrIterator.next())

// 可迭代对象(里面有个[Symbol:iterator]函数，这个函数要返回一个迭代器)
//  const info = {
//   arr: [1, 2, 3],
//   [Symbol.iterator]() {
//     let index = 0
//     return {
//       next:()=> {
//        if(index < info.arr.length){
//          return {
//            done:false,
//            value:info.arr[index++]
//          }
//        }
//        return{
//          done:true,
//        }
//       }
//     }
//   }
// }
// for(const item of info){
//   console.log(item)
// }

class Person {
  static params = []

  constructor(...args) {
    this.name = args[0]
    this.age = args[1]
    Person.params = args
  }

  eat() {
    console.log(11)
  }

  [Symbol.iterator]() {
    let index = 0
    return {
      next: () => {
        if (index < Person.params.length) {
          return {
            done: false,
            value: Person.params[index++]
          }
        }
        return {
          done: true
        }
      },
      //return函数可以监听迭代器中断
      return: () => {
        return {done: true}
      }
    }
  }
}

const p1 = new Person('hua', 18)
// p1.eat()
// p1[Symbol.iterator]()
//
for (const value of p1) {
  console.log(value)
}